package org.sbbs.entity;

import jakarta.annotation.Nullable;
import jakarta.persistence.*;
import jakarta.validation.constraints.NotNull;
import java.io.Serializable;
import org.hibernate.annotations.Comment;

import java.util.Optional;
import lombok.Data;
import org.springframework.data.domain.Persistable;

/**
 * <b>描述:</b><br/>
 * <br/>
 * <b>最基础的实体基类<b/>
 * <br/>
 * ID的类型Long<br/>
 * 实现序列化接口<br/>
 * 实现Spring Data的Persistable接口<br/>
 *
 * 与 @see AbstractPersistable类似,只是id生成临时定为数据库自动生成,可以按照实际需要自行调整<br/>
 * <p>
 * <b>创建时间:</b> 2025年1月14日 12:39:51 <br/>
 * <b>作者:</b> Mr.FDC <fdc_messenger@126.com> <br/>
 * 
 * <br/>
 * <p>
 * <b>修改记录:</b><br/>
 * <ol>
 * <li>......</li>
 * </ol>
 */
@Data
@MappedSuperclass
public class BaseEntity implements Serializable, Persistable<Long> {

	/**
	 * 主键ID
	 */
	@Id
	@Column(name = "id", nullable = false)
	@Comment("主键ID")
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;

	/**
	 * 乐观锁vesion
	 */
	@Version
	@Comment("乐观锁")
	private Long version;

	public @NotNull Optional<Long> getVersion() {
		return Optional.ofNullable(version);
	}

	protected void setVersion(@Nullable Long version) { // <4>
		this.version = version;
	}

	public void setId(Long id) {
		this.id = id;
	}

	/**
	 * Persistable接口获取id
	 * @return id主键值
	 */
	@Override
	public Long getId() {
		return id;
	}

	/**
	 * Persistable接口保存时判别是否为新实体
	 * @return
	 */
	@Transient // DATAJPA-622
	@Override
	public boolean isNew() {
		return this.getId() == null;
	}

}
